package functionroots.primitives;

/**
 * Descreve uma situação na qual o número máximo de iterações foi atingido. O
 * número máximo de iterações é atingido quando os dados iniciais são
 * inadequados, de alguma forma, à solução do problema com a precisão desejada.
 * @author orion
 */
public class MaximumIterationsException extends Exception {
    
    private RootFinder numericalMethod;
    private InitialData initialData;
    private RealFunction targetFunction;
    private double finalValue;

    /**
     * Cria uma nova exceção do tipo MaximumIterationsException a partir do
     * método numérico fornecido
     * @param numericalMethod
     */
    public MaximumIterationsException(RootFinder numericalMethod, 
            InitialData initialData, double finalValue) {
        this.numericalMethod = numericalMethod;
        this.initialData = initialData;
        this.targetFunction = numericalMethod.getFunction();
        this.finalValue = finalValue;
    }

    /**
     * Retorna o método numérico que gerou a exceção.
     * @return o método numérico que gerou a exceção.
     */
    public RootFinder getNumericalMethod() {
        return numericalMethod;
    }

    /**
     * Retorna os dados iniciais associados com a execução do algoritmo
     * retornado por <code>getNumericalMethod()</code> que gerou a exceção.
     * @return os dados iniciais do algoritmo.
     */
    public InitialData getInitialData() {
        return initialData;
    }

    /**
     * Retorna a função alvo do método numérico retornado por <code>
     * getNumericalMethod()</code>.
     * @return a função alvo.
     */
    public RealFunction getTargetFunction() {
        return targetFunction;
    }

    /**
     * Obtém a última aproximação da raiz calculada antes da ococorrência da
     * exceção.
     * @return a última aproximação da raiz.
     */
    public double getFinalValue() {
        return finalValue;
    }
}